﻿#Использовать fs
#Использовать "../src/core"
#Использовать "../src/cmd"

Перем ПутьКТестовомуФайлу;       //    - путь к файлу для тестов
Перем КаталогВременныхДанных;    //    - путь к каталогу временных данных
Перем Лог;                       //    - логгер

#Область ОбработчикиСобытий

// Процедура выполняется после запуска теста
//
Процедура ПередЗапускомТеста() Экспорт
	
	КаталогВременныхДанных = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "build", "tmpdata");
	КаталогВременныхДанных = ФС.ПолныйПуть(КаталогВременныхДанных);

	ПутьКТестовомуФайлу = ОбъединитьПути(КаталогВременныхДанных, "testFile1.tst");

	Лог = ПараметрыСистемы.Лог();

КонецПроцедуры // ПередЗапускомТеста()

// Процедура выполняется после запуска теста
//
Процедура ПослеЗапускаТеста() Экспорт

КонецПроцедуры // ПослеЗапускаТеста()

#КонецОбласти // ОбработчикиСобытий

#Область Тесты

&Тест
Процедура ТестДолжен_СоздатьФайл() Экспорт

	Лог.Информация("Перед тестами: Создание тестового файла");

	ФС.ОбеспечитьПустойКаталог(КаталогВременныхДанных);

	РазмерФайла = 31457280;
	
	СоздатьСлучайныйФайл(ПутьКТестовомуФайлу, РазмерФайла);

	ТекстОшибки = СтрШаблон("Ошибка создания файла ""%1""", ПутьКТестовомуФайлу);

	Утверждения.ПроверитьИстину(ФС.ФайлСуществует(ПутьКТестовомуФайлу), ТекстОшибки);

КонецПроцедуры // ТестДолжен_СоздатьФайл()

&Тест
Процедура ТестДолжен_ПроверитьКопированиеФайла() Экспорт

	Лог.Информация("Тест: Копирование файла");

	КаталогДляКопирования = ОбъединитьПути(КаталогВременныхДанных, "ForCopy");

	ТестовыйФайл = Новый Файл(ПутьКТестовомуФайлу);

	НовыйПутьКТестовомуФайлу = ОбъединитьПути(КаталогДляКопирования, ТестовыйФайл.Имя);

	РаботаСФайлами.КомандаСистемыКопироватьФайл(ПутьКТестовомуФайлу, КаталогДляКопирования);

	ТекстОшибки = СтрШаблон("Ошибка копирования файла ""%1"" -> ""%2""", ПутьКТестовомуФайлу, НовыйПутьКТестовомуФайлу);

	Утверждения.ПроверитьИстину(ФС.ФайлСуществует(НовыйПутьКТестовомуФайлу), ТекстОшибки);

КонецПроцедуры // ТестДолжен_ПроверитьКопированиеФайла()

&Тест
Процедура ТестДолжен_ПроверитьРазбиениеФайлаНаЧасти() Экспорт

	Лог.Информация("Тест: Разбиение файла на части");

	ТестовыйФайл = Новый Файл(ПутьКТестовомуФайлу);

	ПутьКАрхиву = ОбъединитьПути(КаталогВременныхДанных, СтрШаблон("%1.7z.001", ТестовыйФайл.ИмяБезРасширения));

	РаботаСФайлами.ЗапаковатьВАрхив(ПутьКТестовомуФайлу, , , "10m", 1);

	ТекстОшибки = СтрШаблон("Ошибка упаковки файла ""%1"" в архив.", ПутьКТестовомуФайлу);

	Утверждения.ПроверитьИстину(ФС.ФайлСуществует(ПутьКАрхиву), ТекстОшибки);

	ПутьКСпискуФайлов = ОбъединитьПути(КаталогВременныхДанных, СтрШаблон("%1.split", ТестовыйФайл.ИмяБезРасширения));

	ТекстОшибки = СтрШаблон("Ошибка создания списка файлов архива ""%1"" в архив.", ПутьКАрхиву);

	Утверждения.ПроверитьИстину(ФС.ФайлСуществует(ПутьКСпискуФайлов), ТекстОшибки);

КонецПроцедуры // ТестДолжен_ПроверитьРазбиениеФайлаНаЧасти()

&Тест
Процедура ТестДолжен_УдалитьТестовыйФайл() Экспорт

	Лог.Информация("Тест: Удаление файла");

	УдалитьФайлы(ПутьКТестовомуФайлу);

	ТекстОшибки = СтрШаблон("Ошибка удаления файла ""%1""", ПутьКТестовомуФайлу);

	Утверждения.ПроверитьЛожь(ФС.ФайлСуществует(ПутьКТестовомуФайлу), ТекстОшибки);

КонецПроцедуры // ТестДолжен_УдалитьТестовыйФайл()

&Тест
Процедура ТестДолжен_ПроверитьСборкуФайлаИзЧастейИзАрхива() Экспорт

	Лог.Информация("Тест: Сборка файла из частей из архива");

	ТестовыйФайл = Новый Файл(ПутьКТестовомуФайлу);

	Если ТестовыйФайл.Существует() Тогда
		УдалитьФайлы(ПутьКТестовомуФайлу);
	КонецЕсли;

	ПутьКАрхиву = ОбъединитьПути(КаталогВременныхДанных, СтрШаблон("%1.7z.001", ТестовыйФайл.ИмяБезРасширения));
	
	РаботаСФайлами.РаспаковатьАрхив(ПутьКАрхиву);

	ТекстОшибки = СтрШаблон("Ошибка сборки файла из частей ""%1""....", ПутьКАрхиву);

	Утверждения.ПроверитьИстину(ФС.ФайлСуществует(ПутьКТестовомуФайлу), ТекстОшибки);

КонецПроцедуры // ТестДолжен_ПроверитьСборкуФайлаИзЧастейИзАрхива()

&Тест
Процедура ТестДолжен_ПроверитьСборкуФайлаИзЧастейИзСписка() Экспорт

	Лог.Информация("Тест: Сборка файла из частей по списку файлов");

	ТестовыйФайл = Новый Файл(ПутьКТестовомуФайлу);

	Если ТестовыйФайл.Существует() Тогда
		УдалитьФайлы(ПутьКТестовомуФайлу);
	КонецЕсли;

	ПутьКСпискуФайлов = ОбъединитьПути(КаталогВременныхДанных, СтрШаблон("%1.split", ТестовыйФайл.ИмяБезРасширения));
	
	РаботаСФайлами.РаспаковатьАрхив(ПутьКСпискуФайлов, Истина, Истина);

	ТекстОшибки = СтрШаблон("Ошибка сборки файла из частей в списке ""%1""....", ПутьКСпискуФайлов);

	Утверждения.ПроверитьИстину(ФС.ФайлСуществует(ПутьКТестовомуФайлу), ТекстОшибки);

КонецПроцедуры // ТестДолжен_ПроверитьСборкуФайлаИзЧастейИзСписка()

&Тест
Процедура ТестДолжен_УдалитьТестовыйКаталог() Экспорт

	Лог.Информация("После тестов: Удаление тестового каталога");

	УдалитьФайлы(КаталогВременныхДанных);

	ТекстОшибки = СтрШаблон("Ошибка удаления каталога временных файлов ""%1""", КаталогВременныхДанных);

	Утверждения.ПроверитьЛожь(ФС.ФайлСуществует(КаталогВременныхДанных), ТекстОшибки);

КонецПроцедуры // ТестДолжен_УдалитьТестовыйКаталог()

#КонецОбласти // Тесты

#Область СлужебныеПроцедурыИФункции

Процедура СоздатьСлучайныйФайл(ПутьКФайлу, РазмерФайла)

	Если ФС.ФайлСуществует(ПутьКФайлу) Тогда
		УдалитьФайлы(ПутьКФайлу);
	КонецЕсли;

	НачальноеЧисло = 1113;
	ДлинаЧисла     = 8;
	ГраницаГСЧ     = 4294836225;
	
	ЧастейЗаписи     = 100;
	МаксПорцияЗаписи = 10485760;
	ПорцияЗаписи     = 1024;
	Если Цел(РазмерФайла / ЧастейЗаписи) <= МаксПорцияЗаписи Тогда
		ПорцияЗаписи = Цел(РазмерФайла / ЧастейЗаписи);
	Иначе
		ПорцияЗаписи = МаксПорцияЗаписи;
	КонецЕсли;

	ГСЧ = Новый ГенераторСлучайныхЧисел(НачальноеЧисло);

	ЗаписьДанных = Новый ЗаписьДанных(ПутьКФайлу);

	Записано = 0;

	Пока Записано < РазмерФайла Цикл
		Число = ГСЧ.СлучайноеЧисло(0, ГраницаГСЧ);

		ЗаписьДанных.ЗаписатьЦелое64(Число);

		Записано = Записано + ДлинаЧисла;
		Если Записано % ПорцияЗаписи = 0 Тогда
			ЗаписьДанных.СброситьБуферы();
		КонецЕсли;
	КонецЦикла;

	ЗаписьДанных.Закрыть();

КонецПроцедуры // СоздатьФайл()

#КонецОбласти // СлужебныеПроцедурыИФункции
